package builders;

import java.util.HashMap;
import entidades.Cor;
import entidades.Estilo;
import entidades.Familia;
import entidades.TelhaBase;
import entidades.Textura;
import entidades.util.RandomString;
import gestordeentidades.GestorDeEntidades;
import java.util.List;
import sistema.Sistema;

/**
 * Trabalho DAS - 2014/2015
 * @author a21210380, a21190325, a21210392
 */
public class BuilderDeEstilo {
    private final static Integer VALOR_COR_LINHA = 1;
    private final static Integer VALOR_FUNDO = 2;
    private final static Integer VALOR_COR_TEXTO = 3;
    private final static Integer VALOR_NOME = 4;
    private final static Integer VALOR_FAMILIA = 5;
    
    private final HashMap<Integer, Object> valores = new HashMap<>();

    public BuilderDeEstilo() {
    }
    
    public BuilderDeEstilo(TelhaBase telhaBase) {
        setCorDaLinha(telhaBase.getCorDaLinha());
        setCorDoTexto(telhaBase.getCorDoTexto());
        setFundo(telhaBase.getFundo());
        setNomeDoEstilo(telhaBase.getNomeDoEstilo());
    }
    
    public BuilderDeEstilo(Familia familia) {
        setCorDaLinha(familia.getCorLinhaDefault());
        setCorDoTexto(familia.getCorTextoDefault());
        setFundo(familia.getFundoDefault());
        setNomeDoEstilo(RandomString.obterString(10));
        setFamiliaDoEstilo(familia);
    }
    
    public final Cor getCorDaLinha() {
        return (Cor)valores.get(VALOR_COR_LINHA);
    }

    public final Cor getCorDoTexto() {
        return (Cor)valores.get(VALOR_COR_TEXTO);
    }

    public final Textura getFundo() {
        return (Textura)valores.get(VALOR_FUNDO);
    }

    public final void setCorDaLinha(Cor cor) {
        if(cor == null)
            throw new NullPointerException("cor não pode ser null!");
        valores.put(VALOR_COR_LINHA, cor);
    }

    public final void setCorDoTexto(Cor cor) {
        if(cor == null)
            throw new NullPointerException("cor não pode ser null!");
        valores.put(VALOR_COR_TEXTO, cor);
    }

    public final void setFundo(Textura textura) {
        if(textura == null)
            throw new NullPointerException("textura não pode ser null!");
        valores.put(VALOR_FUNDO, textura);
    }

    public final String getNomeDoEstilo() {
        return (String)valores.get(VALOR_NOME);
    }

    public final boolean setNomeDoEstilo(String nome) {
        if(nome == null)
            throw new NullPointerException("nome não pode ser null!");
        
        if(nome.isEmpty()) {
            return false;
        }
        
        if(Sistema.getInstance().nomeDoEstiloDisponivel(nome)) {
            valores.put(VALOR_NOME, nome);
            return true;
        } else {
            return false;
        }
    }
    
    public final boolean setFamiliaDoEstilo(Familia familia) {
        if(familia == null)
            throw new NullPointerException("familia não pode ser null!");
        valores.put(VALOR_FAMILIA, familia);
        return true;
    }
    
    public final Familia getFamiliaDoEstilo() {
        return (Familia)valores.get(VALOR_FAMILIA);
    }
    
    public final boolean estaPronto() {
        return valores.size() == 5;
    }
   
    public final Estilo construirEstilo() {
        if(estaPronto()) {
            return new Estilo(
                    (Familia)valores.get(VALOR_FAMILIA),
                    (String)valores.get(VALOR_NOME), 
                    (Cor)valores.get(VALOR_COR_LINHA), 
                    (Cor)valores.get(VALOR_COR_TEXTO), 
                    (Textura)valores.get(VALOR_FUNDO));
        }
        throw new IllegalStateException("O estilo não está pronto!");
    }
}
